Aula 2 - Manipulação de dados

Introdução ao Tidyverse

Lucas Fernandes de Magalhães

Utilizando pacotes

Instalando e carregando pacotes

   

O R possui uma série de funções que já vêm junto com a sua instalação, como a mean(), seq(), round(), c(), data.frame() e as demais já utilizadas.

Para utilizar outras funções além dessas, é preciso instalar pacotes ou bibliotecas e carregá-las.

   

#install.packages("tidyverse")
#install.packages("rio")
#library(tidyverse)
#library(rio)

Obs: Os pacotes devem ser carregados toda vez que o R for iniciado

Utilizando as funções dos pacotes

   

Existem duas formas de se utilizar as funções dos pacotes.

   

  • A primeira delas já foi explicada. Basta instalar e carregar o pacote que as funções já podem ser imediatamente utilizadas.

  • A segunda é utilizando o nome do pacote seguido de dois pontos duplicados -> dplyr:: OU rio::

Caso surja alguma dúvida a respeito do pacote instalado, uma boa opção é consultar o site abaixo:
R Package Documentation

Utilizando dados externos ao R

Escolhendo o diretório - 1ª opção

   

Escolhendo o diretório - 2ª opção

   

É possível identificar o diretório em que o R está operando utilizando a função getwd()

getwd()
## [1] "T:/COVAD/Curso R/Aula 2"

   

E alterar o diretório utilizando a função setwd().

setwd("C:\\Users\\t0080390\\Downloads\\curso_r\\aula2") #1º forma
setwd("C:/Users/t0080390/Downloads/curso_r/aula2") #2º forma

IMPORTANTE: as barras do caminho do diretório devem ser duplicadas ou invertidas

Importando planilhas

   

Para utilizar uma planilha de excel no R devemos importá-la para o ambiente.

   

Existem diversas funções para importar planilhas, incluindo algumas próprias do R (como a read.csv ou read.csv2).

   

No entanto, iremos utilizar a função import() do pacote rio que já foi instalado, uma vez que ela permite a importação de um maior número de extensões de documentos (.csv, .xslx, .ods, etc.)

Importando planilhas

Existem dois modos de se importar uma planilha:

#O primeiro deles é fixando o diretório e depois utilizar a função import()
setwd("T:\\COVAD\\Curso R\\Aula 2")
jn <- import("jn.xlsx") #Base do relatório Justiça em Números 2019

head(jn[1:5])
##    ano   justica  sigla dsc_tribunal uf_sede
## 1 2009  Estadual   TJAC    TJ - Acre      AC
## 2 2010  Estadual   TJAC    TJ - Acre      AC
## 3 2011 Eleitoral TRE-AC   TRE - Acre      AC
## 4 2011  Estadual   TJAC    TJ - Acre      AC
## 5 2012 Eleitoral TRE-AC   TRE - Acre      AC
## 6 2012  Estadual   TJAC    TJ - Acre      AC
#O segundo é inserindo o caminho do diretório diretamente na função
jn <- import("T:\\COVAD\\Curso R\\Aula 2\\jn.xlsx")
head(jn[1:5])
##    ano   justica  sigla dsc_tribunal uf_sede
## 1 2009  Estadual   TJAC    TJ - Acre      AC
## 2 2010  Estadual   TJAC    TJ - Acre      AC
## 3 2011 Eleitoral TRE-AC   TRE - Acre      AC
## 4 2011  Estadual   TJAC    TJ - Acre      AC
## 5 2012 Eleitoral TRE-AC   TRE - Acre      AC
## 6 2012  Estadual   TJAC    TJ - Acre      AC

Exportando planilhas

   

As planilhas também podem ser exportadas para o diretório desejado utilizando a função export()

   

#O primeiro deles é fixando o diretório e depois utilizar a função export()
#setwd("T:\\COVAD\\Curso R\\Aula 2")
#export(jn, "teste1.csv") #Base do relatório Justiça em Números 2019

#O segundo é inserindo o caminho do diretório diretamente na função
#export(jn, "T:\\COVAD\\Curso R\\Aula 2\\teste2.csv")

#É possível também salvar a planilha em outra extensão, como xlsx:
#export(jn, "T:\\COVAD\\Curso R\\Aula 2\\teste3.xlsx")

Introdução ao Tidyverse

Dplyr

   

Nesta aula, focaremos nos pacotes Dplyr e Tidyr, mas ainda passaremos pelo ggplot e stringr nas próximas.

O Dplyr (d para data frames e plyr para pliers) é a gramática da manipulação de dados, contendo uma série de verbos (funções) que permitem resolver a maior parte dos desafios relacionados à manipulação.

Ao longo desta aula, passaremos pelas seguintes funções:

   

  • filter()

  • slice ()

  • select()

  • arrange()

  • mutate()

  • summarise()

  • group_by()

Select()

Selecionando as colunas da planilha - Revisão

   

Na primeira aula, aprendemos a selecionar as colunas de uma base utilizando colchetes

   

#Selecionar as colunas pelo indexador

jn1 <- jn[,c(1,2,3)]
dim(jn1)
## [1] 890   3
#Selecionar as colunas pelos nomes

jn1 <- jn[,c("ano", "justica","sigla")]
dim(jn1)
## [1] 890   3

Selecionando as colunas da planilha com select()

IMPORTANTE: o primeiro argumento de todas as funções é sempre a base de dados

   

Para selecionar colunas com o dplyr basta usar a função select()

#Selecionar as colunas pelo indexador
jn1 <- select(jn, 1,2,3)
dim(jn1)
## [1] 890   3
#Selecionar as colunas pelos nomes
jn1 <- select(jn, ano, justica, sigla)
dim(jn1)
## [1] 890   3
#Selecionar as colunas pelo conteúdo do seu nome
jn1 <- select(jn, starts_with("arq"))

Excluindo colunas

   

Para excluir colunas, basta incluir um sinal de negativo (-) antes do nome da coluna

dim(jn)
## [1]  890 1456
jn1 <- select(jn, -starts_with("arq"))
dim(jn1)
## [1]  890 1449

   

Para os próximos exercícios, selecione as seguintes colunas: ano, justica, sigla, uf_sede, uf_abrangida, ftt, g1, g10a, g10b, g10c, g10d

jn <- select(jn, ano, justica, sigla,regiao, starts_with("uf"),ftt, g1, starts_with("g10"))

Filter()

Filtrando colunas com colchetes - revisão

   

jn1 <- jn[jn$ano==2018,]
head(jn1[1:5], n=5)
##     ano   justica  sigla   regiao uf_sede
## 17 2018 Eleitoral TRE-AC    Norte      AC
## 18 2018  Estadual   TJAC    Norte      AC
## 44 2018 Eleitoral TRE-AL Nordeste      AL
## 45 2018  Estadual   TJAL Nordeste      AL
## 46 2018  Trabalho  TRT19 Nordeste      AL
jn1 <- jn[jn$uf_abrangida=="Nordeste",]
head(jn1[1:5], n=5)
##     ano  justica sigla   regiao uf_sede
## 19 2009 Estadual  TJAL Nordeste      AL
## 21 2010 Estadual  TJAL Nordeste      AL
## 24 2011 Estadual  TJAL Nordeste      AL
## 27 2012 Estadual  TJAL Nordeste      AL
## 30 2013 Estadual  TJAL Nordeste      AL

Filtrando colunas com o dplyr

   

Antes de aprendermos a filtrar, precisamos conhecer os operadores de comparação utilizados no R:

   

  • Igualdade: \(==\)

  • Diferença: \(!=\)

  • Menor que: \(<\)

  • Maior que: \(>\)

  • Menor ou igual: \(<=\)

  • Maior ou igual: \(>=\)

Filtrando colunas com o dplyr

   

Lembrem-se, o primeiro argumento das funções do dplyr é SEMPRE A BASE DE DADOS

   

jn1 <- filter(jn, ano >= 2016)

jn1 <- filter(jn, uf_abrangida == "Sudeste")

jn1 <- filter(jn, uf_abrangida != "Nordeste")

Filtrando múltiplas colunas

É possível filtrar por múltiplas colunas ao mesmo tempo. Para tanto, além dos operadores de comparação, temos que conhecer também os operadores lógicos: “”

  • “&” ou a vírgula (,) são sinônimos de E, isto é, filtra apenas as observações que cumprem as duas condições

  • “|” é um sinônimo de OU, ou seja, filtra as observações que cumprem uma observação ou a outra

Filtrando múltiplas colunas

   

jn1 <- filter(jn, ano == 2016 &  uf_sede == "SP")
nrow(jn1)
## [1] 6
jn1 <- filter(jn, ano == 2016 |  uf_sede == "SP")
nrow(jn1)
## [1] 146

Filtrando por múltiplos valores

   

Para filtrar múltiplos valores de uma única coluna é necessário usar o operador %in%

   

jn1 <- filter(jn, ano %in% c(2016,2018))

jn1 <- filter(jn, sigla %in% c("TJMG", "TJSP", "TJRJ", "TJRS") &
                g10d>7000)

Slice()

Selecionando linhas

   

A função slice() serve para selecionar linhas específicas da base de dados

   

jn1 <- slice(jn, 1:5) #seleciona da primeira à quinta linha


jn1 <- slice(jn, 890:n()) #seleciona da 890 à última linha



jn1 <- slice(jn, -1:-4) #Exclui as 4 primeiras linhas

Arrange()

Ordenando a base de dados

   

A função arrange() corresponde à classificação da base de dados a partir dos valores das colunas. Assim como no Excel, é possível classificar uma ou mais colunas em ordem crescente ou decrescente (basta colocar o nome da coluna dentro do argumento desc()).

jn1 <- arrange(jn, ano, uf_sede)
head(jn1, n=5)
##    ano  justica sigla   regiao uf_sede       uf_abrangida  ftt          g1
## 1 2009 Estadual  TJAC    Norte      AC              Norte 1813 0.014827827
## 2 2009 Estadual  TJAL Nordeste      AL           Nordeste 2426 0.006583269
## 3 2009 Trabalho TRT19 Nordeste      AL            Alagoas  793 0.004438447
## 4 2009 Estadual  TJAM    Norte      AM              Norte 2650 0.004294022
## 5 2009 Trabalho TRT11    Norte      AM Amazonas e Roraima 1203 0.004107223
##   g10a g10b     g10c     g10d
## 1   NA   NA       NA 2658.065
## 2   NA   NA 18117.33 4369.663
## 3   NA   NA 16748.71 8057.550
## 4   NA   NA 22532.21 5064.874
## 5   NA   NA 32207.87       NA
jn1 <- arrange(jn, desc(ano), ftt)
head(jn1, n=5)
##    ano          justica  sigla  regiao uf_sede      uf_abrangida ftt
## 1 2018 Militar Estadual  TJMRS     Sul      RS Rio Grande do Sul 141
## 2 2018 Militar Estadual  TJMMG Sudeste      MG      Minas Gerais 179
## 3 2018        Eleitoral TRE-RR   Norte      RR           Roraima 247
## 4 2018 Militar Estadual  TJMSP Sudeste      SP         São Paulo 258
## 5 2018        Eleitoral TRE-AC   Norte      AC              Acre 261
##             g1     g10a     g10b     g10c      g10d
## 1 7.354124e-05 608144.0 125218.3 36757.04  7706.516
## 2 9.493060e-05 784555.4 227058.2 43905.69  9689.269
## 3 4.305523e-03 128028.3 253306.8 50116.18  1766.383
## 4 3.088603e-05 567693.5 179676.6 36326.23 11193.814
## 5 4.492207e-03 113856.8 225363.4 33220.20 10688.216

Mutate()

Criando novas colunas

   

O objetivo da função mutate() é permitir criar novas colunas a partir das já existentes

   

#Criar uma nova coluna que corresponde à média de despesa por funcionário
jn1 <- mutate(jn, med_func= (g10a+g10b+g10c+g10d)/4)



#Criar uma nova coluna que corresponde a quantas vezes as categorias de funcionários ganham em relação às outras

jn1 <- mutate(jn, mag_serv= (g10a/g10b), serv_terc=(g10b/g10c), terc_est=(g10c/g10d))
jn1 %>% filter (ano==2017, justica=="Estadual") %>% select(3,13,14,15) %>%  head(n=5)
##   sigla mag_serv serv_terc  terc_est
## 1  TJAC 5.530942  4.487870  1.296539
## 2  TJAL 4.453916  3.477776  2.334373
## 3  TJAM 3.243453  1.238992 17.435706
## 4  TJAP 3.636119  5.547056  3.861168
## 5  TJBA 3.296825  4.895988  4.832222

Summarise()

Estatísticas sumárias da base

   

A função summarise() visa obter estatísticas da base por colunas

Summarise()

Por exemplo, podemos obter a média das despesas por magistrados, servidores, terceirizados ou estagiários

summarise(jn, media_mag=mean(g10a, na.rm=T))
##   media_mag
## 1  416383.1
summarise(jn, media_serv=mean(g10b, na.rm=T))
##   media_serv
## 1   186989.7
summarise(jn, media_ter=mean(g10c, na.rm=T))
##   media_ter
## 1  38330.61
summarise(jn, media_est=mean(g10d, na.rm=T))
##   media_est
## 1  9642.114

group_by()

Realizando manipulações por grupo

   

Todas as manipulações realizadas até então podem ser aplicadas a grupos, ao invés de aplicadas à base de dados inteira

Combinando o group_by com as outras funções

   

Como descobrir quais são 5 Tribunais que pagam os melhores salários aos servidores em 2018?

jn1 <- filter(jn, ano==2018)
jn1 <- arrange(jn1, desc(g10b))
jn1 <- slice(jn1, 1:5) #Esses códigos podem ser substituídos pela função top_n
jn1$sigla
## [1] "TRE-AP" "JMU"    "STM"    "TRT10"  "TRT12"

Como descobrir quais são 3 Tribunais que pagam os melhores salários aos servidores por justiça?

jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, justica) #Agrupando por justiça
jn1 <- arrange(jn1, desc(g10b)) #Após agrupar, o restante do algoritmo é o mesmo
jn1 <- slice(jn1, 1:3)
jn1[c(2,3)]
## # A tibble: 19 x 2
## # Groups:   justica [7]
##    justica          sigla 
##    <chr>            <chr> 
##  1 Eleitoral        TRE-AP
##  2 Eleitoral        TRE-RN
##  3 Eleitoral        TRE-AL
##  4 Estadual         TJDFT 
##  5 Estadual         TJBA  
##  6 Estadual         TJTO  
##  7 Federal          TRF4  
##  8 Federal          TRF   
##  9 Federal          TRF2  
## 10 Militar Estadual TJMMG 
## 11 Militar Estadual TJMSP 
## 12 Militar Estadual TJM   
## 13 Militar Uniao    JMU   
## 14 Superior         STM   
## 15 Superior         STJ   
## 16 Superior         TSE   
## 17 Trabalho         TRT10 
## 18 Trabalho         TRT12 
## 19 Trabalho         TRT1

Combinando o group_by com as outras funções

Já calculamos qual é a média geral dos salários dos servidores. Agora, qual é a média dos salários dos servidores por região em 2018?

jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, regiao)
jn1 <- summarise(jn1, med_venc=mean(g10b, na.rm=T))
jn1 <- arrange(jn1, desc(med_venc))
jn1
## # A tibble: 6 x 2
##   regiao       med_venc
##   <chr>           <dbl>
## 1 União         236680.
## 2 Sul           208886.
## 3 Norte         208337.
## 4 Sudeste       208139.
## 5 Nordeste      201151.
## 6 Centro-Oeste  198556.

E por justiça?

jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, justica)
jn1 <- summarise(jn1, med_venc=mean(g10b, na.rm=T))
jn1 <- arrange(jn1, desc(med_venc))
jn1
## # A tibble: 7 x 2
##   justica          med_venc
##   <chr>               <dbl>
## 1 Militar Uniao     302120.
## 2 Superior          265222.
## 3 Trabalho          248232.
## 4 Federal           245277.
## 5 Eleitoral         207063.
## 6 Militar Estadual  177839.
## 7 Estadual          162892.

Combinando o group_by com as outras funções

   

E por justiça e região? Sim, é possível agrupar por mais de uma coluna

jn1 <- filter(jn, ano==2018)
jn1 <- group_by(jn1, justica, regiao)
jn1 <- summarise(jn1, med_venc=mean(g10b, na.rm=T))
jn1 <- arrange(jn1, desc(med_venc), justica, regiao)
jn1
## # A tibble: 27 x 3
## # Groups:   justica [7]
##    justica       regiao       med_venc
##    <chr>         <chr>           <dbl>
##  1 Militar Uniao União         302120.
##  2 Trabalho      União         272687.
##  3 Superior      União         265222.
##  4 Federal       Sul           262558.
##  5 Trabalho      Sul           261326.
##  6 Trabalho      Norte         248115.
##  7 Trabalho      Sudeste       247045.
##  8 Federal       Sudeste       243577.
##  9 Federal       União         242590.
## 10 Trabalho      Centro-Oeste  241756.
## # ... with 17 more rows

Join

Unindo Tabelas por chaves (keys)

   

Em várias ocasiões as informações de que precisamos estão divididas em duas ou mais tabelas, que possuem em comum apenas uma única variável (chave)

Left join

   

Se o nosso objetivo é obter todas as colunas da tabela 2, cujos IDs também existem na tabela 1, devemos usar o left-join:

   

# Importar as duas bases que serão unidas

jn1 <- import("jn1.xlsx")
jn2 <- import("jn2.xlsx")

# Executar a função left join

jn3 <- left_join(x=jn1, y=jn2, by=c("ID"="ID")) #Usar o argumento "by" quando as chaves não possuírem o mesmo nome

jn3 <- left_join(x=jn1, y=jn2) #Se as chaves possuem o mesmo nome, o "by" é desnecessário
## Joining, by = "ID"

Bônus: pipe %>%

Aninhando funções

   

Em várias situações, precisaremos utilizar várias funções para completar um único objetivo: média de salário dos serviores por região, por exemplo.

Para evitar termos que criar vários objetos ou sobrescrever um deles várias vezes, podemos aninhar funções.

#Calcular a média da proporção de salários dos magistrados em relação aos servidores por região em 2018

jn1 <-   arrange(summarise(group_by(mutate(filter(jn, ano==2018), mag_serv=g10a/g10b), regiao),med_mag_serv=mean(mag_serv, na.rm = T)), desc(med_mag_serv))
jn1
## # A tibble: 6 x 2
##   regiao       med_mag_serv
##   <chr>               <dbl>
## 1 Centro-Oeste         2.57
## 2 Sul                  2.46
## 3 Sudeste              2.22
## 4 Norte                2.15
## 5 Nordeste             2.15
## 6 União                1.98

Aninhando funções com o pipe

   

Ao invés de concatenar inúmeras funções deixando o código totalmente ilegível, podemos usar o operador pipe \(%>%\) através do atalho ctrl+shift+m.

Em termos simples, o operador pipe “pega” o resultado da operação anterior e o utiliza como o input do primeiro argumento da função seguinte. É justamente por isso que ele é tão útil combinado com as funções do dplyr: todas as funções geram um data frame e demandam como primeiro argumento um data frame!!!

   

Aninhando funções com o pipe

jn1 <- jn %>% filter(ano==2018) %>% mutate(mag_serv=g10a/g10b) %>% 
              group_by(regiao) %>% summarise(med_mag_serv=mean(mag_serv, na.rm = T)) %>% 
              arrange(desc(med_mag_serv))
jn1
## # A tibble: 6 x 2
##   regiao       med_mag_serv
##   <chr>               <dbl>
## 1 Centro-Oeste         2.57
## 2 Sul                  2.46
## 3 Sudeste              2.22
## 4 Norte                2.15
## 5 Nordeste             2.15
## 6 União                1.98